/**
 * 设备类型注册服务
 * 
 * 用于管理小程序支持的各种设备类型模块
 * 提供设备类型的注册、获取和验证功能
 */

const { logger } = require('../utils/logger');

// 设备类型注册表
const deviceTypesRegistry = {};

/**
 * 注册设备类型模块
 * @param {Object} deviceTypeModule - 设备类型模块
 * @returns {boolean} 注册是否成功
 */
function registerDeviceType(deviceTypeModule) {
  if (!deviceTypeModule || !deviceTypeModule.DEVICE_TYPE) {
    logger.error('注册失败：无效的设备类型模块');
    return false;
  }
  
  const deviceType = deviceTypeModule.DEVICE_TYPE;
  
  // 检查是否已存在该类型
  if (deviceTypesRegistry[deviceType]) {
    logger.warn(`设备类型 "${deviceType}" 已注册，将被覆盖`);
  }
  
  // 验证模块是否实现了必要的接口
  if (!validateDeviceTypeModule(deviceTypeModule)) {
    logger.error(`设备类型 "${deviceType}" 未实现必要的接口，注册失败`);
    return false;
  }
  
  // 注册设备类型
  deviceTypesRegistry[deviceType] = deviceTypeModule;
  logger.info(`设备类型 "${deviceType}" (${deviceTypeModule.DEVICE_NAME}) 注册成功`);
  return true;
}

/**
 * 获取已注册的设备类型模块
 * @param {string} deviceType - 设备类型标识
 * @returns {Object|null} 设备类型模块或null
 */
function getDeviceType(deviceType) {
  return deviceTypesRegistry[deviceType] || null;
}

/**
 * 获取所有已注册的设备类型信息
 * @returns {Array} 设备类型信息数组
 */
function getAllDeviceTypes() {
  return Object.keys(deviceTypesRegistry).map(key => ({
    type: key,
    name: deviceTypesRegistry[key].DEVICE_NAME || key,
    icon: deviceTypesRegistry[key].DEVICE_ICON || '',
    version: deviceTypesRegistry[key].DEVICE_VERSION || '1.0.0',
    capabilities: deviceTypesRegistry[key].capabilities || {}
  }));
}

/**
 * 验证设备类型模块是否实现了必要的接口
 * @param {Object} module - 设备类型模块
 * @returns {boolean} 验证是否通过
 */
function validateDeviceTypeModule(module) {
  // 必要的属性和方法
  const requiredProperties = [
    'DEVICE_TYPE', 
    'isDeviceOfType', 
    'getChannelCount', 
    'getDefaultSettings'
  ];
  
  // 必要的服务模块
  const requiredServices = [
    'rgbwParser',
    'storage',
    'lightModeEnhanced'
  ];
  
  // 检查必要的属性和方法
  for (const prop of requiredProperties) {
    if (module[prop] === undefined) {
      logger.error(`设备类型模块缺少必要的属性或方法: ${prop}`);
      return false;
    }
  }
  
  // 检查必要的服务模块（可能是空对象，但必须存在）
  for (const service of requiredServices) {
    if (!module[service]) {
      logger.error(`设备类型模块缺少必要的服务模块: ${service}`);
      return false;
    }
  }
  
  return true;
}

/**
 * 卸载设备类型模块
 * @param {string} deviceType - 设备类型标识
 * @returns {boolean} 卸载是否成功
 */
function unregisterDeviceType(deviceType) {
  if (!deviceType || !deviceTypesRegistry[deviceType]) {
    logger.warn(`设备类型 "${deviceType}" 不存在，无法卸载`);
    return false;
  }
  
  delete deviceTypesRegistry[deviceType];
  logger.info(`设备类型 "${deviceType}" 已卸载`);
  return true;
}

/**
 * 检查设备类型是否已注册
 * @param {string} deviceType - 设备类型标识
 * @returns {boolean} 是否已注册
 */
function isDeviceTypeRegistered(deviceType) {
  return !!deviceTypesRegistry[deviceType];
}

/**
 * 获取已注册设备类型数量
 * @returns {number} 已注册设备类型数量
 */
function getRegisteredTypeCount() {
  return Object.keys(deviceTypesRegistry).length;
}

module.exports = {
  registerDeviceType,
  getDeviceType,
  getAllDeviceTypes,
  unregisterDeviceType,
  isDeviceTypeRegistered,
  getRegisteredTypeCount
}; 